'use client'; import { useState, useEffect } from 'react'; import { useParams, useRouter } from 'next/navigation'; import { invitationsApi, InvitationInfo } from '@/lib/api'; import { useAuth } from '@/lib/auth-context'; export default function InvitePage() { const params = useParams(); const token = params.token as string; const router = useRouter(); const { user, token: authToken } = useAuth(); const [invitation, setInvitation] = useState(null); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); const [accepting, setAccepting] = useState(false); const [accepted, setAccepted] = useState(false); useEffect(() => { invitationsApi.verify(token) .then(({ invitation: inv }) => setInvitation(inv)) .catch(() => setError('This invitation is invalid or has expired.')) .finally(() => setLoading(false)); }, [token]); const isUsedOrExpired = invitation && (invitation.alreadyMember || invitation.isExpired); const handleAccept = async () => { if (!authToken) { // Redirect to login with invite token, come back after router.push(`/login?invite_token=${token}`); return; } setAccepting(true); try { await invitationsApi.accept(token); setAccepted(true); // Refresh projects list after a short delay setTimeout(() => router.push(`/projects`), 1500); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to accept invitation'); } finally { setAccepting(false); } }; if (loading) { return (

Verifying invitation…

); } if (error && !invitation) { return (

Invalid Invitation

{error}

); } {/* Show project info even for expired/used invitations */} if (isUsedOrExpired) { return (
{invitation!.alreadyMember ? ( ) : ( )}

{invitation!.alreadyMember ? 'Already Joined' : 'Invitation Expired'}

{invitation!.alreadyMember ? `You're already a member of ${invitation!.projectName}.` : `This invitation to ${invitation!.projectName} is no longer valid.`}

{invitation!.alreadyMember ? 'Visit your projects to start collaborating.' : 'Ask the project admin to send a new invitation.'}

); } if (accepted) { return (

Welcome!

You've joined {invitation?.projectName}. Redirecting…

); } return (
{/* Project icon */}

You're invited

to join project

{invitation?.projectName}

{/* Role badge */}
{invitation?.role.toLowerCase()}
{invitation?.alreadyMember ? (

You're already a member of this project.

) : !user ? (

Create an account or sign in to accept this invitation.

) : invitation?.isOwnInvitation ? (

This invitation was sent to {user.email}

) : (

Email mismatch

This invitation was sent to {invitation?.email}.
You're currently logged in as {user.email}.

Sign in with the correct account, or ask the project admin to resend the invitation.

)} {/* Expiry */} {invitation?.expiresAt && (

Expires {new Date(invitation.expiresAt).toLocaleDateString()}

)} {error && (

{error}

)}
); }